#include <stdio.h>
#include <iostream>
using  namespace std;

struct ListNode
{
    int val;
    struct ListNode * next;
    ListNode(int x):val(x),next(NULL)
    {}
};

ListNode * EntryNodeOfLoop(ListNode * pHead)
{
    if(pHead==NULL)
    {
        return NULL;
    }
    ListNode * fast=pHead;
    ListNode * slow=pHead;
    ListNode * cross=NULL;
    while(fast!=NULL)
    {
        slow=slow->next;
        if(fast->next==NULL)
        {
            break;
        }
        fast=fast->next->next;
        if(fast==slow)
        {
            cross=fast;
            break;
        }
    }
    if(cross==NULL)
    {
        return NULL;
    }
    fast=pHead;
    while(fast!=slow)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return fast;
}

void test()
{
    ListNode * pos_1=new ListNode(1);
    ListNode * pos_2=new ListNode(2);
    ListNode * pos_3=new ListNode(3);
    ListNode * pos_4=new ListNode(4);
    ListNode * pos_5=new ListNode(5);
    ListNode * pos_6=new ListNode(6);
    pos_1->next=pos_2;
    pos_2->next=pos_3;
    pos_3->next=pos_4;
    pos_4->next=pos_5;
    pos_5->next=pos_6;
    pos_6->next=pos_3;
    ListNode * ret=EntryNodeOfLoop(pos_1);
    if(ret)
    {
        cout<<ret->val<<endl;
    }
}
int main()
{
    test();
    return 0;
}

